#ifndef ML_JOINT_BOOSTING_H_
#define ML_JOINT_BOOSTING_H_

#include "ZMLAlgorithm.h"

GLOBAL_NAMESPACE_BEGIN
NAMESPACE_MACHINE_LEARNING_BEGIN

class MLJointBoostingImpl;
class MLWeakLearner;
class MLJointBoostingParams;

class MLJointBoosting : public MLAlgorithm
{
public:
    MLJointBoosting();
    ~MLJointBoosting();

    void init(const Eigen::MatrixXd& data);
    void init(const Eigen::MatrixXd& data, const Eigen::MatrixXi& labels);
    bool commit();

    void setParams(int roundM, int stepNum=10);

    int     train   (const Eigen::MatrixXd& trainData, const Eigen::MatrixXi& labels);
    double  evaluate(const Eigen::MatrixXd& trainData, int dataIdx, int classIdx) const;
    double  evaluate(const Eigen::RowVectorXd& oneData, int classIdx) const;
    Eigen::RowVectorXd evaluate(const Eigen::RowVectorXd& oneData) const;
    Eigen::MatrixXi predict (const Eigen::MatrixXd& data, Eigen::MatrixXd& evalMat) const;

    double evalError(const Eigen::MatrixXd& trainData, const Eigen::MatrixXi& labels);

    void addWeakLearner(MLWeakLearner* weakLearner);
    int            getWeakLearnerCount() const ;
    MLWeakLearner* getWeakLearnerOf(int idx) const;
    MLJointBoostingParams* getParams() const;

private:
    std::auto_ptr<MLJointBoostingImpl> impl_;
};

NAMESPACE_MACHINE_LEARNING_END
GLOBAL_NAMESPACE_END


#endif//ML_JOINT_BOOSTING_H_